package com.yupi.yuojbackendserviceclient.service;



import com.yupi.yuojbackendcommon.common.ErrorCode;
import com.yupi.yuojbackendcommon.exception.BusinessException;
import com.yupi.yuojbackendmodel.model.entity.User;

import com.yupi.yuojbackendmodel.model.enums.UserRoleEnum;
import com.yupi.yuojbackendmodel.model.vo.UserVO;
import org.springframework.beans.BeanUtils;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;


import javax.servlet.http.HttpServletRequest;

import java.util.Collection;
import java.util.List;

import static com.yupi.yuojbackendcommon.constant.UserConstant.USER_LOGIN_STATE;



//value表示此User接口对应的在nacos上面的微服务的名称 直接去User微服务的yml去复制就好
    //path就是定义的全局的前缀 在网关处进行统一路径用的 也在User微服务的yml去复制就好
@FeignClient(name = "yuoj-backend-user-service",path = "/api/user/inner")
public interface UserFeignClient  {


    //照着微服务之间划分出来的相互调用的公共方法进行实现接口的定义
    //userService.getById(userId) 而外写一下这个是mybatis-plus提供的 不是我们自己实现的
    //userService.getUserVO(user) 1
    //userService.listByIds(userIdSet) 而外写一下这个是mybatis-plus提供的 不是我们自己实现的
    //userService.isAdmin(loginUser) 1
    //userService.getLoginUser(request) 1

    @GetMapping("/get/id")
    User getById(@RequestParam("userId") long userId);
    @GetMapping("/get/ids")
    List<User> listByIds(@RequestParam("idList") Collection<Long> idList);


    /**
     * 获取当前登录用户
     *
     * @param request
     * @return
     */
    //HttpServletRequest request这个对象不是一个普通的对象 不能保证传输的过程中可以序列化可能导致数据的丢失
    // 所以对于用户服务，有一些不利于远程调用参数传递、或者实现起来非常简单（工具类），可以直接用默认方法，无需远程调用，节约性能
    //走默认方法的就不需要加上注解路径了 因为加上这个路径的作用是去到对应的接口找到对应的路径进行匹配 取出接口方法的实现类 这里实现类已经定义好了
    default User getLoginUser(HttpServletRequest request){
        // 先判断是否已登录
        Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);
        User currentUser = (User) userObj;
        if (currentUser == null || currentUser.getId() == null) {
            throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
        }
//        // 从数据库查询（追求性能的话可以注释，直接走缓存）
//        long userId = currentUser.getId();
//        currentUser = this.getById(userId);
//        if (currentUser == null) {
//            throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
//        }
        return currentUser;
    }

    /**
     * 是否为管理员
     *
     * @param user
     * @return
     */
    //对于用户服务实现起来非常简单（工具类），可以直接用默认方法，无需远程调用，节约性能
    default boolean isAdmin(User user){

        return user != null && UserRoleEnum.ADMIN.getValue().equals(user.getUserRole());
    }

    /**
     * 获取脱敏的用户信息
     *
     * @param user
     * @return
     */
   default UserVO getUserVO(User user){
       if (user == null) {
           return null;
       }
       UserVO userVO = new UserVO();
       BeanUtils.copyProperties(user, userVO);
       return userVO;
   }


}
